/**
 * @file falling_edge.h
 * @author your name (you@domain.com)
 * @brief 下降沿检测器,用于检测输入信号的下降沿
 * @version 0.1
 * @date 2025-04-09
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef FALLING_EDGE_H
#define FALLING_EDGE_H
#include <stddef.h>
#include <stdint.h>

// 定义每个监控变量的状态结构体
typedef struct {
    uint8_t* variable;        // 指向被监控的变量
    uint8_t  last_state;      // 上一次的状态
    uint8_t  falling_trigger; // 下降沿触发标志 (1 表示触发, 0 表示未触发)
    uint8_t  debounce_count;  // 去抖计数器
    uint8_t  debounce_limit;  // 去抖阈值（连续采样次数）
} FallingEdgeMonitor;

// 定义管理多个监控实例的结构体
typedef struct {
    FallingEdgeMonitor* monitors; // 监控数组
    size_t              count;    // 当前监控数量
    size_t              capacity; // 数组容量
} FallingEdgeDetector;

/**
 * @brief 初始化下降沿检测器
 *
 * @param detector
 * @param buffer
 * @param capacity
 */
void init_falling_detector(FallingEdgeDetector* detector, FallingEdgeMonitor* buffer, size_t capacity);

/**
 * @brief 绑定变量到下降沿检测器
 *
 * @param detector
 * @param variable
 * @return int
 */
int bind_falling_variable(FallingEdgeDetector* detector, uint8_t* variable);

/**
 * @brief 检测所有绑定变量的下降沿并更新触发状态（带去抖动）
 *
 * @param detector
 */
void detect_falling_edges(FallingEdgeDetector* detector);

/**
 * @brief 检查是否触发了下降沿
 *
 * @param detector
 * @param variable
 * @return uint8_t
 */
uint8_t is_falling_edge_triggered(FallingEdgeDetector* detector, uint8_t* variable);
#endif
